package com.sinostride.hibernate.model;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * 实体类User
 * @author lh
 * 与数据表对应，用于封装数据表的一行记录。(1-n个)
 */
//@SuppressWarnings("serial")
@Entity //建表
@Table(name="tb_usertable")//表名
public class User  {
	
	//在此处添加annoation,破坏了面向对象的封装性
	private Integer id;
	private String name;
	private Integer age;
	private String password;
	private Timestamp date;

	@Id //定义主键
	@GeneratedValue(strategy=GenerationType.AUTO)//主键生成器
	
	/**
	 * 使用@GeneratedValue(strategy=GenerationType)注解可以定义该标识符的生成策略
	   ①、AUTO- (默认)可以是identity column类型,或者sequence类型或者table类型,取决于不同的底层数据库.相当于native

	   ②、TABLE- 使用表保存id值

	   ③、IDENTITY- identity column

	   ④、SEQUENCE- sequence 
	   
	          对于mysql,使用auto / identity
	          对于sqlServer,使用identity
	          对于Oracle,使用SEQUENCE
	   
	  */
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @Column描述了数据库表中该字段的详细定义
	 * name:表示数据库表中该字段的名称,默认情形属性名称一致
	 * nullable:表示该字段是否允许为null,默认为true
	 * unique:表示该字段是否是唯一标识,默认为false
	 * length:表示该字段的大小,仅对String类型的字段有效
	 * insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true
	 * updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true.对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段.
	 * columnDefinition:表示该字段在数据库中的实际类型.通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用.
	 * @return
	 */
	@Column(name="user_name",length=50,nullable=false) //字段属性
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Column(name="user_age")
	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}
	
	@Column(name="user_password", length=50, nullable=false )
	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	/**
	 * 用于定义映射到数据库的时间精度
	 * DATE: 日期
	 * TIME: 时间
	 * TIMESTAMP:日期+时间
	 * @return
	 * //	@Temporal(TemporalType.DATE)---报错
	 */

	@Column(name="user_date", nullable=true ,columnDefinition="Timestamp")
	public Timestamp getDate() {
		return date;
	}

	public void setDate(Timestamp date) {
		this.date = date;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", age=" + age +"]";
	}
}
